#ifndef CCourrierBRH
#define CCourrierBRH
//---------------------------------------------------------------------------
#include "Outils.h"
#include "CCarnAdrBR.h" //Pour eTypeRestauration
#include <SysUtils.hpp>
#include <Controls.hpp>
#include <Classes.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
struct TRefModele
   {
   AnsiString aLogiciel;
   AnsiString aCategorie;
   AnsiString aLibelle;
   };

typedef void __fastcall (__closure *TInsertDiskCourrierEvent)(int NumDisk,
                                                        const AnsiString &FilePath,
                                                        bool &Abort,
                                                        bool Backup);

typedef void __fastcall (__closure *TIncrementationCourrierEvent)(WORD BRPercents,
                                                          WORD PatternPercents,
                                                          WORD FilePercents,
                                                          bool Backup);

typedef bool (*FctSauverTout)(const AnsiString &aLogiciel,
                              const AnsiString &aFichierCible,
                              const AnsiString &aRepTemp,
                              TInsertDiskCourrierEvent FctInsererDisquette,
                              TIncrementationCourrierEvent FctProgression);

typedef bool (*FctSauverModeles)(TList *lstModelesASauvegarder,
                                 const AnsiString &aFichierCible,
                                 const AnsiString &aRepTemp,
                                 TInsertDiskCourrierEvent FctInsererDisquette,
                                 TIncrementationCourrierEvent FctProgression);


typedef bool (*FctDecompresser)(const AnsiString &aFichierSource, const AnsiString &aRepTemp,
                                TInsertDiskCourrierEvent FctInsererDisquette,
                                TIncrementationCourrierEvent FctProgression);
typedef bool (*FctRestaurerModeles)(enum eTypeRestauration ModeRestauration);
typedef bool (*FctRestaurerAPartirCoordDoss)(unsigned long *ulNumero,
                                             eTypeRestauration ModeRestauration,
                                             const AnsiString &aRepSecondaire);
typedef bool (*FctEffacer)(void);
typedef bool (*FctRafraichirRepDatasCourrier)(void);

typedef bool (*FctSauvegarderModReq)(const AnsiString &aRepTableModReq,
                                  const AnsiString &aFichierCible,
                                  const AnsiString &aRepTemp,
                                  TInsertDiskCourrierEvent FctInsererDisquette,
                                  TIncrementationCourrierEvent FctProgression);

typedef bool (*FctRestaurerModReq)(const AnsiString &aFichierSource,
                                const AnsiString &aRepTemp,
                                enum eTypeRestauration ModeRestauration,
                                const AnsiString &aRepSecondaire);

class PACKAGE_OUTILS CCourrierBR : public TComponent
{
private:
  AnsiString m_aNomLogiciel;
  AnsiString m_aRepTravail;
  AnsiString m_aRepTmp;
  AnsiString m_aNomFichier;
  HINSTANCE hCourrier;
  FctSauverTout _SauverTout;
  FctSauverModeles _SauverModeles;
  FctDecompresser _Decompresser;
  FctRestaurerModeles _RestaurerModeles;
  FctRestaurerAPartirCoordDoss _RestaurerAPartirCoordDoss;
  FctEffacer _Effacer;
  FctRafraichirRepDatasCourrier _RafraichirRepDatas;
  TList *m_ListeModeles;
  FctSauvegarderModReq _SauvegarderModReq;
  FctRestaurerModReq _RestaurerModReq;

  TInsertDiskCourrierEvent FOnInsertFloppy;
  TIncrementationCourrierEvent FOnIncrementation;

  void __fastcall SetRepTemp (const AnsiString aRep);
  void __fastcall SetRepTrav (const AnsiString aRep);
  bool __fastcall Effacer();
  void __fastcall ViderListeModeles();
  
protected:
public:
  __fastcall CCourrierBR(TComponent* Owner);
  virtual __fastcall ~CCourrierBR();

  /// Fonctions de sauvegarde
  //////////////////////////////////////////////////////////////////////////////
  // 1a) Sauvegarde le carnet d'adresses, les tables du courrier et les courriers utilisés, pour le logiciel paramétré.
  //////////////////////////////////////////////////////////////////////////////
  bool __fastcall SauverTout();

  // 2) Sauvegarde des modèles spécifiés
  //////////////////////////////////////////////////////////////////////////////
  //2a)Ajoute ce modèle à la liste des modèles à sauvegarder
  void __fastcall AddModele(const AnsiString &Logiciel,
                            const AnsiString &Categorie,
                            const AnsiString &Libelle);
  //2b)Effectue la sauvegarde
  bool __fastcall SauverModeles();

  // 3) Sauvegarde les modèles utilisés dans un dossier (Ils sont recencés dans la table ModReq.db)
  //////////////////////////////////////////////////////////////////////////////
  bool __fastcall SauvegarderModReq(const AnsiString &aRepTableModReq);

  /// Fonctions de restauration
  //////////////////////////////////////////////////////////////////////////////
  /// 1a) Décompression du fichier de sauvegarde
  /// puis Restauration des courriers et fiches du carnet d'adresses associés à une coordonnée
  //////////////////////////////////////////////////////////////////////////////
  bool __fastcall Decompresser(void);
  bool __fastcall Restaurer(unsigned long *NumeroCoordonnee,
                            eTypeRestauration eModeRestauration,
                            const AnsiString &aRepSecondaire = EmptyStr);
  /// 1b) Restaure tous les modèles de la sauvegarde => ATTENTION : Si un nom de fichier est renommé => les noms de fichiers des modèles "dossiers" ne seront pas mis à jour
  //////////////////////////////////////////////////////////////////////////////
  bool __fastcall RestaurerModeles(enum eTypeRestauration eModeRestauration);

  /// 1b) Restaure tous les modèles utilisés (Source : fichier .br spécifié par les propriétés RepertoireTravail et NomFichier)
  //////////////////////////////////////////////////////////////////////////////
  bool __fastcall RestaurerModReq(enum eTypeRestauration eModeRestauration,
                                  const AnsiString &aRepSecondaire = EmptyStr);


  bool __fastcall RafraichirRepDatas();

__published:
  __property AnsiString NomLogiciel          = { read = m_aNomLogiciel, write = m_aNomLogiciel};
  __property AnsiString RepertoireTravail    = { read = m_aRepTravail, write = SetRepTrav};
  __property AnsiString RepertoireTemporaire = { read = m_aRepTmp, write = SetRepTemp};
  __property AnsiString NomFichier           = { read = m_aNomFichier, write = m_aNomFichier};

   //Evenement appeler lors de la demande d'insertion d'une disquette, s'il est absent la gestion est automatique
   __property TInsertDiskCourrierEvent OnInsererDisquette = {read=FOnInsertFloppy, write=FOnInsertFloppy};
   //Evenement appeler pour géréer une barre de progression, s'il est absent la gestion est automatique
   __property TIncrementationCourrierEvent OnIncrementation = {read=FOnIncrementation, write=FOnIncrementation};

};
//---------------------------------------------------------------------------
#endif
